// @Description 学习编写 web 前的预备知识, 了解 http 库
// @Author insight21
// @Since 2021/9/10
package prepare

import (
	"fmt"
	"log"
	"net/http"
)

func start() {
	// 根据路径调用不同函数
	http.HandleFunc("/", indexHandler)
	http.HandleFunc("/hello", helloHandler)
	// 调用 ListenAndServe 启动服务, 指明监听 8080 端口
	// 第二个参数代表处理所有的 HTTP 请求的实例 nil 代表使用标准库中的实例处理
	log.Fatal(http.ListenAndServe(":8080", nil))
}

func startWithHandler() {
	handler := new(MyHandler)
	log.Fatal(http.ListenAndServe(":8080", handler))
}

type MyHandler struct {}

func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	switch r.URL.Path {
	case "/":
		_, err := fmt.Fprintf(w, "URL.PATH = %q\n", r.URL.Path)
		if err != nil {
			panic(err)
		}
	case "/hello":
		for k, v := range r.Header {
			_, err := fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
			if err != nil {
				panic(err)
			}
		}
	default:
		_, err := fmt.Fprintf(w, "404 NOT FOUND: %q\n", r.URL.Path)
		if err != nil {
			panic(err)
		}
	}
}

func indexHandler(w http.ResponseWriter, r *http.Request) {
	_, err := fmt.Fprintf(w, "URL.PATH = %q\n", r.URL.Path)
	if err != nil {
		panic(err)
	}
}

func helloHandler(w http.ResponseWriter, r *http.Request) {
	for k, v := range r.Header {
		_, err := fmt.Fprintf(w, "Header[%q] = %q\n", k, v)
		if err != nil {
			panic(err)
		}
	}
}